﻿using System;
using System.Collections.Generic;
using System.Text;

namespace AlgorithmTest
{
    public class T_0011_IsAnagram
    {
        // 有效的字母异位词

        // 给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。
        // 注意：若 s 和 t 中每个字符出现的次数都相同，则称 s 和 t 互为字母异位词。

        // 提示:
        //  1 <= s.length, t.length <= 5 * 10^4
        //  s 和 t 仅包含小写字母

        // 进阶: 如果输入字符串包含 unicode 字符怎么办？你能否调整你的解法来应对这种情况？

        public void Test()
        {
            var s = "anagram";
            var t = "nagaram";
            Console.WriteLine(IsAnagram(s, t));
            Console.Read();
        }

        // 遍历计数
        public bool IsAnagram(string s, string t)
        {
            if (s.Length != t.Length)
                return false;
            var sCount = new int[26];
            var tCount = new int[26];
            var sChars = s.ToCharArray();
            var tChars = t.ToCharArray();
            for (int i = 0; i < sChars.Length; i++)
            {
                sCount[sChars[i] - 'a']++;
                tCount[tChars[i] - 'a']++;
            }
            for (int i = 0; i < sCount.Length; i++)
            {
                if (sCount[i] != tCount[i])
                    return false;
            }
            return true;
        }

        // 遍历计数（一个数组）
        public bool IsAnagram1(string s, string t)
        {
            if (s.Length != t.Length)
                return false;
            var count = new int[26];
            var sChars = s.ToCharArray();
            var tChars = t.ToCharArray();
            for (int i = 0; i < sChars.Length; i++)
            {
                count[sChars[i] - 'a']++;
                count[tChars[i] - 'a']--;
            }
            for (int i = 0; i < count.Length; i++)
            {
                if (count[i] != 0)
                    return false;
            }
            return true;
        }

        // 遍历一次
        public bool IsAnagram2(string s, string t)
        {
            if (s.Length != t.Length)
                return false;
            char[] cs = s.ToCharArray();
            char[] ct = t.ToCharArray();
            int[] map = new int[26];
            int count = 0;
            for (int i = 0; i < cs.Length; i++)
            {
                //出现了一个新的字符
                if (++map[cs[i] - 'a'] == 1)
                    count++;
                //消失了一个新的字符
                if (--map[ct[i] - 'a'] == 0)
                    count--;
            }
            return count == 0;
        }

    }
}
